package org.Yiran.timetale_re.item.rune.type.throwable;

import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import org.Yiran.timetale_re.item.rune.type.throwable.base.ThrowableRune;

/**
 * 雷暴符文实现类
 * <p>
 * 该类实现了具体的投掷类符文——雷暴符文。
 * 当玩家投掷雷暴符文并在击中目标或地面时，会在击中位置生成闪电效果。
 * 这是投掷类符文的一个具体实现，继承自ThrowableRune基类。
 * </p>
 */
public class ThunderRune extends ThrowableRune {
    
    // ==============================
    // 构造方法
    // ==============================

    /**
     * 雷暴符文构造函数
     * <p>
     * 创建一个雷暴符文实例，设置符文类型为"thunder"，冷却时间为0。
     * 作为投掷类符文，冷却时间参数会被父类强制设置为0。
     * </p>
     */
    public ThunderRune() {
        super("thunder", 0); // 设置冷却时间为0
    }

    // ==============================
    // 符文效果实现
    // ==============================

    /**
     * 执行具体的符文效果 - 在指定位置生成闪电
     * <p>
     * 实现了雷暴符文的具体效果：在击中位置生成闪电。
     * 这个方法在投掷的符文实体击中目标或地面时由父类调用。
     * </p>
     *
     * @param stack  符文物品堆，包含具体符文信息的物品实例
     * @param level  当前世界对象，提供游戏环境上下文
     * @param player 使用符文的玩家对象
     * @param hitPos 击中的位置向量
     */
    @Override
    public void executeRuneEffect(ItemStack stack, Level level, Player player, net.minecraft.world.phys.Vec3 hitPos) {
        // 确保只在服务端执行
        if (level.isClientSide() || !(level instanceof ServerLevel serverLevel)) {
            return;
        }

        // 在击中位置生成闪电
        strikeLightning(serverLevel, player, hitPos);
    }

    // ==============================
    // 辅助方法
    // ==============================

    /**
     * 在指定位置生成闪电
     * <p>
     * 创建并放置一个闪电实体到指定位置，将其归属于玩家。
     * 如果当前玩家是服务器玩家，则设置闪电的触发者。
     * </p>
     *
     * @param level    当前服务器世界对象
     * @param player   使用符文的玩家对象
     * @param position 生成闪电的位置向量
     */
    private void strikeLightning(ServerLevel level, Player player, net.minecraft.world.phys.Vec3 position) {
        // 创建闪电实体
        net.minecraft.world.entity.LightningBolt lightning = net.minecraft.world.entity.EntityType.LIGHTNING_BOLT.create(level);
        if (lightning != null) {
            lightning.moveTo(position);
            lightning.setCause(player instanceof net.minecraft.server.level.ServerPlayer ? (net.minecraft.server.level.ServerPlayer) player : null);
            level.addFreshEntity(lightning);
        }
    }
}